package net.labdemo.common.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import com.fasterxml.jackson.annotation.JsonIgnore;
/**
 * 分页查询载体
 * @author xiaofanku
 * 20160613
 * @param <T>
 */
public class Page<T> {

	//--------------------------入口--------------------------
	/**
	 * 第几页
	 */
	private final int pageNumber;
	/**
	 * 每页显示的数量
	 */
	private final int pageSize;
	//--------------------------
	/**
	 * 记录的总数量
	 */
	private int count;
	//--------------------------输出--------------------------
	/**
	 * 结果集
	 */
	private List<T> result;
	//--------------------------查询时需要--------------------------
	/**
	 * 排序部分
	 * org.apache.ibatis.ognl.OgnlException: orderBy [java.lang.NullPointerException]
	 */
	private String orderBy="";
	/**
	 * 分页载体
	 * @param pageNumber 当前页码
	 * @param pageSize 每显示显示的数量
	 */
	public Page(int pageNumber, int pageSize) {
		
		this.pageNumber = pageNumber;
		this.pageSize = pageSize;
		
		result=new ArrayList<>();
	}
	/**
	 * 分页载体
	 * @param pageNumber 当前页码
	 * @param pageSize 每显示显示的数量
	 * @param order 排序语句,没有order关键词,例:id desc
	 */
	public Page(int pageNumber, int pageSize,String order) {
		this(pageNumber,pageSize);
		this.orderBy=order;
	}
	public void setResult(List<T> result) {
		this.result = result;
	}
	public List<T> getResult() {
		return result;
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
	public int getPageSize() {
		return pageSize;
	}
	public int getPageNumber() {
		return pageNumber;
	}
	
	/**
	 * 获取查询排序字符串
	 * 
	 * @return
	 */
	@JsonIgnore
	public String getOrderBy() {
		// SQL过滤，防止注入
		String reg = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|" + "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";
		Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
		if (sqlPattern.matcher(orderBy).find()) {
			return "";
		}
		return orderBy;
	}
	/**
	 * 设置查询排序，标准查询有效， 实例： updatedate desc, name asc
	 */
	public void setOrderBy(String orderBy) {
		this.orderBy = orderBy;
	}
	
	public int getCursorStart() {
		int firstResult = (getPageNumber() - 1) * getPageSize();
		if (firstResult >= getCount()) {
			firstResult = 0;
		}
		return firstResult;
	}
	/**
	 * 打印页码结构
	 * @param link 无页码参数的连接地址
	 * @param numberRange 页码值的范围
	 * @return
	 */
	public IqidoPage getIqidoPage(String link,int numberRange){
		return new IqidoPage(link,pageNumber,pageSize,count,numberRange);
	}
	/**
	 * 打印页码结构
	 * @param link 无页码参数的连接地址
	 * @return
	 */
	public IqidoPage getIqidoPage(String link){
		return new IqidoPage(link,pageNumber,pageSize,count);
	}
	@Override
	public String toString() {
		return "Page [pageNumber=" + pageNumber + ", pageSize=" + pageSize + ", count=" + count + "]";
	}
	
}
